/**
 * 通用方法库
 * User: kevin
 * Date: 2019/5/31
 * Copyright: (c) 2019-2022 DUSTAR
 */




/**
 * 设置cookie
 *
 * @param {string} key 键
 * @param {string} value 值
 * @param {string|int} hours 时间（单位：小时）
 * @return {void}
 */
export function setCookie(key, value, hours = 3) {
    const exp = new Date();
    exp.setTime(exp.getTime() + hours * 3600000); // 3600000 = 60*60*1000
    document.cookie = `${key}=${encodeURIComponent(value)};expires=${exp.toUTCString()}`;
}


/**
 * 获取cookie
 * @param {string} key 键
 * @return {string|null}
 */
export function getCookie(key) {
    const match = document.cookie.match(new RegExp(`(^| )${key}=([^;]*)(;|$)`));
    return match ? decodeURIComponent(match[2]) : null;
}


/**
 * 删除cookie
 * @param {string} key 键
 * @return {void}
 */
export function delCookie(key) {
    const exp = new Date();
    exp.setTime(exp.getTime() - 1); // 设置过期时间为过去
    const val = getCookie(key);
    if (val) {
        document.cookie = `${key}=${val};expires=${exp.toUTCString()}`;
    }
}

/**
 * 获取URL参数
 * @param {string} [url] 可选URL，默认取当前页面URL
 * @return {object} 参数键值对
 */
export function getUrlParams(url) {
    // 处理URL，提取查询字符串部分（?后的内容）
    const queryString = url
        ? url.split('?')[1] || ''
        : window.location.search.slice(1);

    return queryString
        .split('&')
        .filter(param => param) // 过滤空字符串
        .reduce((params, param) => {
            const [key, value] = param.split('=').map(decodeURIComponent);
            params[key] = value;
            return params;
        }, {});
}

/**
 * 产生随机数
 *
 * @param {int} length 字符串长度
 * @param charsType 随机字符范围
 * @return {string}
 */
export function strRandom(length, charsType = [0]) {
    const charsArr = [
        '0123456789',
        'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        'abcdefghijklmnopqrstuvwxyz'
    ];

// 拼接选中的字符池（根据 charsType 筛选）
    const chars = charsType.map(type => charsArr[type]).join('');
    const charsLength = chars.length;

// 生成随机字符串（用 Array.from 替代 for 循环）
    return Array.from({ length }, () =>
        chars.charAt(Math.floor(Math.random() * charsLength))
    ).join('');
}


/**
 * html转码
 *
 * @param {string} str 需要转码的字符串
 * @return {string}
 */
export function htmlEncode(str) {
    let s = "";
    if (str.length === 0) return "";
    s = str.replace(/&/g, "&gt;");
    s = s.replace(/</g, "&lt;");
    s = s.replace(/>/g, "&gt;");
    s = s.replace(/ /g, "&nbsp;");
    s = s.replace(/\'/g, "&#39;");
    s = s.replace(/\"/g, "&quot;");
    s = s.replace(/\n/g, "<br>");
    return s;
}

/**
 * 浮点保留小数
 *
 * @param {float} src 浮点数字
 * @param {int} pos 保留位数
 * @return {number}
 */
export function formatFloat(src, pos) {
    return Math.round(src * Math.pow(10, pos)) / Math.pow(10, pos);
}

/**
 * 将100000转为100,000.00形式
 *
 * @param {int|string} money 处理前数字
 * @return {string}
 */
export function dealNumber(money) {
    // 处理 null/undefined/空字符串等无效值
    if (money === null || money === undefined || money === '') return '';
    // 转换为数字（处理字符串类型的数字）
    const num = Number(money);
    // 处理非数字情况
    if (isNaN(num)) return '';

    // 利用 toFixed(2) 统一保留两位小数，再处理千分位
    const [integerPart, decimalPart] = num.toFixed(2).split('.');
    // 处理整数部分的千分位（反转后分组再反转回来）
    const formattedInteger = integerPart
        .replace(/^-/, '') // 暂存负号，先处理数字部分
        .split('').reverse().join('')
        .match(/\d{1,3}/g)
        .join(',')
        .split('').reverse().join('');
    // 拼接负号（如果有）、整数部分和小数部分
    return `${num < 0 ? '-' : ''}${formattedInteger}.${decimalPart}`;
}


/**
 * 将100,000.00转为100000形式
 *
 * @param {string} money 处理前数字
 * @return {int|string}
 */
export function undoNumber(money) {
    if (!money || typeof money !== 'string') return '';
    // 移除千分位逗号
    const withoutCommas = money.replace(/,/g, '');
    // 验证是否为合法数字格式（整数或小数）
    if (!/^-?\d+(\.\d+)?$/.test(withoutCommas)) return ''; // 非法格式返回空
    // 转换为数字（自动处理纯整数情况，如 '100000.00' → 100000）
    const num = Number(withoutCommas);
    // 处理 NaN（理论上不会走到这里，因前面已验证）
    return isNaN(num) ? '' : num;
}


/**
 * js加载
 *
 * @param {string} url 链接地址
 * @return {boolean}
 */
export function loadScript(url) {
    let script = document.createElement("script")
    script.type = "text/javascript";
    script.src = url;
    document.getElementsByTagName("head")[0].appendChild(script);
}



/**
 * 判断是否是IE浏览器
 *
 * @return {boolean}
 */
export function isIE() {
    return !!window.ActiveXObject || "ActiveXObject" in window;
}


export function setLocalStorage(key, data, expire = 86400 * 1000) {
  let copyData = JSON.parse(JSON.stringify(data));
  copyData.payUrl = "";
  copyData.payShow = "";
  localStorage.setItem(key, JSON.stringify({data:copyData, expire: Date.now() + expire}));
}


export function getLocalStorage(key) {
  const itemStr = localStorage.getItem(key);
  if (!itemStr) return null;
  const item = JSON.parse(itemStr);
  if (Date.now() > item['expire']) {
    localStorage.removeItem(key); // 如果过期，删除数据
    return null;
  }

  return item.data;
}

export function calendarShow(date) {
  const year = date.getFullYear();
  const month = ('0' + (date.getMonth() + 1)).slice(-2);
  const day = ('0' + date.getDate()).slice(-2);
  let weekDay = "";
  switch (date.getDay()) {
    case 0:weekDay = '星期天';break;
    case 1:weekDay = '星期一';break;
    case 2:weekDay = '星期二';break;
    case 3:weekDay = '星期三';break;
    case 4:weekDay = '星期四';break;
    case 5:weekDay = '星期五';break;
    case 6:weekDay = '星期六';break;
  }

  return `${year}年${month}月${day}日 (${weekDay})`;
}




export function isCredentialsExpired(credentials) {
    if (!credentials) return true;
    const expireDate = new Date(credentials.expiration);
    const now = new Date();
    return expireDate.getTime() - now.getTime() <= 60000;
}


export function formatTime(timestamp) {
    // 创建 Date 对象
    const date = new Date(parseInt(timestamp));
    // 获取小时和分钟
    const hours = String(date.getHours()).padStart(2, '0');
    const minutes = String(date.getMinutes()).padStart(2, '0');
    // 返回格式化后的时间字符串
    return `${hours}:${minutes}`;
}

export function formatTimestamp(timestamp) {
    const date = new Date(timestamp);
    // 补零函数
    const padZero = (num) => num.toString().padStart(2, '0');
    // 提取各时间部分
    const year = date.getFullYear();
    const month = padZero(date.getMonth() + 1); // 月份从0开始
    const day = padZero(date.getDate());
    const hours = padZero(date.getHours());
    const minutes = padZero(date.getMinutes());
    const seconds = padZero(date.getSeconds());

    // 拼接格式
    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}


export function formatMilliseconds(ms) {
    // 计算小时和分钟
    const hours = Math.floor(ms / 3600000); // 1小时 = 3600000毫秒
    const minutes = Math.floor((ms % 3600000) / 60000); // 1分钟 = 60000毫秒
    // 拼接格式化字符串
    let result = '';
    if (hours >= 0) result += `${hours}小时`;
    if (minutes >= 0) result += `${minutes}分`;
    return result.trim() || '0分'; // 若为 0，则返回 '0min'
}


export function device() {
    const width = window.innerWidth;
    // 这里的临界值可根据实际需求进行调整
    if (width < 650) return 'mobile'
    if (width < 1100) return 'pad'
    return 'pc';
}


export function getYYYYMM(date = new Date()) {
    const year = date.getFullYear();
    const month = (date.getMonth() + 1).toString().padStart(2, '0');
    return `${year}${month}`;
}



export async function upload(fileInfo, axios) {
    let credentials = null;
    if (getCookie("credentials"))
      credentials = JSON.parse(getCookie("credentials"));
    if (isCredentialsExpired(credentials)) {
      let res = await axios.get('/get_sts_token_for_oss_upload');
      credentials = res;
      setCookie("credentials", JSON.stringify(res));
    }

    const client = new OSS({
      // yourRegion填写Bucket所在地域。以华东1（杭州）为例，Region填写为oss-cn-hangzhou。
      region: 'oss-cn-hangzhou',
      // 从STS服务获取的临时访问密钥（AccessKey ID和AccessKey Secret）。
      accessKeyId: credentials['accessKeyId'],
      accessKeySecret: credentials['accessKeySecret'],
      // 从STS服务获取的安全令牌（SecurityToken）。
      stsToken: credentials['securityToken'],
      // 填写Bucket名称。
      bucket: 'dustar-upload'
    });

    let extension = fileInfo.type.split("/")[1];
    let fileName = Date.now() + '-' + strRandom(16, "0,2");

    try {
        return await client.put(`/client/eevee_upload/${getYYYYMM()}/${fileName}.${extension}` , fileInfo);
    } catch (e) {

    }
}
